﻿using System;
using System.Collections.Generic;
using System.Reflection;
using Demo.CommonBase.DTO.Filters;
using Demo.CommonBase.DTO.Infos;
using Demo.CommonBase.Exceptions;
using Demo.CommonBase.Logging;
using Demo.Services.Contracts.DTO.Filters;
using Demo.Services.Contracts.DTO.Infos;
using Demo.Services.Integration.DAO.Impl;
using Demo.Services.Services.Impl.DomainObjects.Helppers;

namespace Demo.Services.Services.Impl.DomainObjects
{
    public class ProyectDomainObject
    {
        public List<ProyectInfo> GetProyects(ProyectFilter filter)
        {
            List<ProyectInfo> result = null;
            ProyectDAO proyectdao;
            try
            {
                //Logger.Info();
                proyectdao = new ProyectDAO();
                result = proyectdao.GetProyects(filter);
            }

            catch (Exception ex)
            {
                Logger.Error(ex);
                throw new UnhandledException(MethodBase.GetCurrentMethod(), ex);
            }
            return result;
        }

        public void SaveProyect(ProyectInfo projectInfo)
        {
            ProyectDAO proyectdao;
            try
            {
                Logger.Info();
                proyectdao = new ProyectDAO();
                if (projectInfo.Id != 0)
                {
                    proyectdao.UpdateProyect(projectInfo);
                }
                else
                {
                    int id = proyectdao.SaveProyect(projectInfo);
                    projectInfo.Id = id;
                }
                if (projectInfo.TecnologyList == null)
                {
                    projectInfo.TecnologyList = new List<TecnologyInfo>();
                }
                string tecnoogyList = XMLHelper.GetXML(projectInfo.TecnologyList);
                if (projectInfo.AreaList == null)
                {
                    projectInfo.AreaList = new List<AreaInfo>();
                }
                string areaList = XMLHelper.GetXML(projectInfo.AreaList);

                proyectdao.SaveProyectTecnologyDetail(projectInfo.Id, tecnoogyList);
                proyectdao.SaveProyectAreaDetail(projectInfo.Id, areaList);
            }

            catch (Exception ex)
            {
                Logger.Error(ex);
                throw new UnhandledException(MethodBase.GetCurrentMethod(), ex);
            }
        }

        public void UpdateProyect(ProyectInfo info)
        {
            ProyectDAO proyectdao;
            try
            {
                Logger.Info();
                proyectdao = new ProyectDAO();
                proyectdao.UpdateProyect(info);
            }

            catch (Exception ex)
            {
                Logger.Error(ex);
                throw new UnhandledException(MethodBase.GetCurrentMethod(), ex);
            }
        }

        public void DeleteProyect(int id)
        {
            ProyectDAO proyectdao;
            try
            {
                Logger.Info();
                proyectdao = new ProyectDAO();
                proyectdao.DeleteProyect(id);
            }

            catch (Exception ex)
            {
                Logger.Error(ex);
                throw new UnhandledException(MethodBase.GetCurrentMethod(), ex);
            }
        }

        public ProjectResultInfo GetProyectList(PaginationInfo pagin, ProyectFilter filters)
        {
            ProyectDAO proyectdao;
            ProjectResultInfo result;
            try
            {
                Logger.Info();
                proyectdao = new ProyectDAO();
                result = proyectdao.GetProyectList(pagin, filters);
            }

            catch (Exception ex)
            {
                Logger.Error(ex);
                throw new UnhandledException(MethodBase.GetCurrentMethod(), ex);
            }
            return result;
        }

        public ProyectInfo GetProyect(int id)
        {
            ProyectDAO proyectdao;
            ProyectInfo result;
            try
            {
                Logger.Info();
                proyectdao = new ProyectDAO();
                result = proyectdao.GetProyectById(id);
            }

            catch (Exception ex)
            {
                Logger.Error(ex);
                throw new UnhandledException(MethodBase.GetCurrentMethod(), ex);
            }
            return result;
        }

        public CommonComboBoxPagingInfo GetProyectsByName(ComboBoxFilter filter)
        {
            CommonComboBoxPagingInfo result = null;
            ProyectDAO proyectdao;
            try
            {
                Logger.Info();
                proyectdao = new ProyectDAO();
                result = proyectdao.GetProyect_ByName(filter);
            }

            catch (Exception ex)
            {
                Logger.Error(ex);
                throw new UnhandledException(MethodBase.GetCurrentMethod(), ex);
            }
            return result;
        }

        public ProyectInfo GetProyectById(int id)
        {
            ProyectInfo result = null;
            ProyectDAO proyectdao;
            TecnologyDomainObject tecnologyDO;
            try
            {
                Logger.Info();
                proyectdao = new ProyectDAO();
                tecnologyDO = new TecnologyDomainObject();
                result = proyectdao.GetProyectById(id);
                result.TecnologyList = GetAssignedTecnologies(id);
                result.AreaList = GetAssignedAreas(id);
            }

            catch (Exception ex)
            {
                Logger.Error(ex);
                throw new UnhandledException(MethodBase.GetCurrentMethod(), ex);
            }
            return result;
        }

        public List<TecnologyInfo> GetAssignedTecnologies(int projectId)
        {
            List<TecnologyInfo> result = null;
            ProyectDAO proyectdao;
            try
            {
                Logger.Info();
                proyectdao = new ProyectDAO();
                result = proyectdao.GetAssignedTecnologies(projectId);
            }

            catch (Exception ex)
            {
                Logger.Error(ex);
                throw new UnhandledException(MethodBase.GetCurrentMethod(), ex);
            }
            return result;
        }

        public List<TecnologyInfo> GetUnAssignedTecnologies(int projectId)
        {
            List<TecnologyInfo> result = null;
            ProyectDAO proyectdao;
            try
            {
                Logger.Info();
                proyectdao = new ProyectDAO();
                result = proyectdao.GetUnAssignedTecnologies(projectId);
            }

            catch (Exception ex)
            {
                Logger.Error(ex);
                throw new UnhandledException(MethodBase.GetCurrentMethod(), ex);
            }
            return result;
        }

        public List<AreaInfo> GetAssignedAreas(int projectId)
        {
            List<AreaInfo> result = null;
            ProyectDAO proyectdao;
            try
            {
                Logger.Info();
                proyectdao = new ProyectDAO();
                result = proyectdao.GetAssignedAreas(projectId);
            }

            catch (Exception ex)
            {
                Logger.Error(ex);
                throw new UnhandledException(MethodBase.GetCurrentMethod(), ex);
            }
            return result;
        }

        public List<AreaInfo> GetUnAssignedAreas(int projectId)
        {
            List<AreaInfo> result = null;
            ProyectDAO proyectdao;
            try
            {
                Logger.Info();
                proyectdao = new ProyectDAO();
                result = proyectdao.GetUnAssignedAreas(projectId);
            }

            catch (Exception ex)
            {
                Logger.Error(ex);
                throw new UnhandledException(MethodBase.GetCurrentMethod(), ex);
            }
            return result;
        }

        public bool CheckName(int id, string name)
        {
            bool isValid = false;
            ;
            ProyectDAO proyectdao;
            try
            {
                Logger.Info();
                proyectdao = new ProyectDAO();
                isValid = proyectdao.CheckName(id, name);
            }

            catch (Exception ex)
            {
                Logger.Error(ex);
                throw new UnhandledException(MethodBase.GetCurrentMethod(), ex);
            }
            return isValid;
        }

        public List<ProjectReportInfo> GetProjectStatus()
        {
            List<ProjectReportInfo> result;
            ProyectDAO proyectDao;
            try
            {
                Logger.Info();
                proyectDao = new ProyectDAO();
                result = proyectDao.GetProjectStatus();
            }
            catch (Exception ex)
            {
                Logger.Error(ex);
                throw new UnhandledException(MethodBase.GetCurrentMethod(), ex);
            }
            return result;
        }
    }
}